#ifndef __FIBER_THREAD_H_
#define __FIBER_THREAD_H_

#include <pthread.h>
#include <functional>
#include <iostream>
#include <memory>

namespace fiber 
{
class Thread {
public:
    // 定义智能指针类型，方便线程对象的管理（自动释放资源）
    using ptr = std::shared_ptr<Thread>;

    /**
     * 构造函数：创建线程对象
     * @param cb 线程启动后要执行的回调函数（无参数，无返回值）
     * @param name 线程名称（用于标识和调试）
     */
    Thread(std::function<void()> cb, const std::string &name);

    /**
     * 析构函数：销毁线程对象，释放相关资源
     */
    ~Thread();

    /**
     * 获取线程 ID（系统级线程 ID）
     * @return 线程的 pid_t 类型 ID
     */
    pid_t getId() const { return m_id; }

    /**
     * 获取线程名称
     * @return 线程名称的常量引用
     */
    const std::string &getName() const { return m_name; }

    /**
     * 等待线程执行结束（阻塞当前线程，直到该线程完成）
     */
    void join();

public:
    /**
     * 静态方法：获取当前正在执行的线程对象指针
     * @return 当前线程的 Thread* 指针
     */
    static Thread *GetThis();

    /**
     * 静态方法：获取当前线程的名称
     * @return 当前线程名称的常量引用
     */
    static const std::string &GetName();

    /**
     * 静态方法：设置当前线程的名称
     * @param name 要设置的线程名称
     */
    static void SetName(const std::string &name);

private:
    // 禁用拷贝构造、移动构造和赋值运算符（线程对象不可复制）
    Thread(const Thread &) = delete;
    Thread(const Thread &&) = delete;
    Thread operator=(const Thread &) = delete;

    /**
     * 静态方法：线程入口函数（pthread 要求的函数格式）
     * 用于包装用户提供的回调函数，作为 pthread_create 的参数
     * @param args 传递给线程的参数（此处为 Thread 对象指针）
     * @return 线程执行结束后的返回值（通常为 nullptr）
     */
    static void *run(void *args);

private:
    pid_t m_id;                  // 线程 ID（系统调用返回的 ID）
    pthread_t m_thread;          // pthread 库的线程句柄
    std::function<void()> m_cb;  // 线程要执行的回调函数
    std::string m_name;          // 线程名称
};  

}  // namespace fiber

#endif  // __FIBER_THREAD_H_